

import bpy

from 全局控制.Node.数据编辑.物体 import bl_修改器公共选项

import 全局控制.Node.节点和插座基类.bl_节点基类 as 基类


import engine.initLIB.load_dll as engineLib
import ctypes






E_烟雾类型枚举 = [
	("NONE", "None", "", 0),
	("DOMAIN", "Domain", "", 1),
	("FLOW", "Flow", "", 2),
	("COLLISION", "Collision", "", 3),
]




def f_update_修改器可视(self, context):
	修改对象 = self.inputs['修改对象'].f_getData()
	bl_修改器公共选项.f_批量update_修改器可视(修改对象, self.m_修改器名称, self.m_是否显示)


def f_update_修改器可渲(self, context):
	修改对象 = self.inputs['修改对象'].f_getData()
	bl_修改器公共选项.f_批量update_修改器可渲(修改对象, self.m_修改器名称, self.m_是否渲染)


def f_update_烟雾修改器类型(self, context):
	self.f_update()

def f_update_烟雾修改器_设置精度(self, context):
	修改对象 = self.inputs['修改对象集'].f_getData()
	for obj in 修改对象:
		if self.m_烟雾类型 == 'DOMAIN':
			修改器 = obj.modifiers[self.m_修改器名称]
			修改器.domain_settings.resolution_max = self.m_精度

def f_update_烟雾修改器_set缓存名称(self, context):
	修改对象 = self.inputs['修改对象集'].f_getData()
	for obj in 修改对象:
		if self.m_烟雾类型 == 'DOMAIN':
			修改器 = obj.modifiers[self.m_修改器名称]
			修改器.domain_settings.point_cache.name = self.m_缓存名称

def f_update_烟雾修改器_set文件路径(self, context):
	修改对象 = self.inputs['修改对象集'].f_getData()
	for obj in 修改对象:
		if self.m_烟雾类型 == 'DOMAIN':
			修改器 = obj.modifiers[self.m_修改器名称]
			修改器.domain_settings.point_cache.filepath = self.m_根路径 + self.m_缓存名称
			
def f_update_烟雾修改器_set外部缓存(self, context):
	修改对象 = self.inputs['修改对象集'].f_getData()
	for obj in 修改对象:
		if self.m_烟雾类型 == 'DOMAIN':
			修改器 = obj.modifiers[self.m_修改器名称]
			修改器.domain_settings.point_cache.use_external = self.m_外部路径

def f_update_烟雾修改器_set高精度(self, context):
	修改对象 = self.inputs['修改对象集'].f_getData()
	for obj in 修改对象:
		if self.m_烟雾类型 == 'DOMAIN':
			修改器 = obj.modifiers[self.m_修改器名称]
			修改器.domain_settings.use_high_resolution = self.m_高精度
			


class C_Node_烟雾修改器(基类.C_Node_基类):
	bl_dname = 'bl_node_烟雾修改器'
	bl_label = '烟雾修改器'
	bl_icon = 'MOD_SOLIDIFY'
	
	m_修改器名称 = bpy.props.StringProperty(name="修改器名称", default='Solidify')
	m_是否渲染 = bpy.props.BoolProperty(default=True, update=f_update_修改器可渲)
	m_是否显示 = bpy.props.BoolProperty(default=True, update=f_update_修改器可视)
	
	m_烟雾类型 = bpy.props.EnumProperty(items=E_烟雾类型枚举, name="类型", default="NONE", update=f_update_烟雾修改器类型)

	m_外部路径 = bpy.props.BoolProperty(default=False, update=f_update_烟雾修改器_set外部缓存)
	m_缓存名称 = bpy.props.StringProperty(name="缓存名称", update=f_update_烟雾修改器_set缓存名称)
	m_根路径 = bpy.props.StringProperty(name="根路径", subtype='DIR_PATH', update=f_update_烟雾修改器_set文件路径)
	m_高精度 = bpy.props.BoolProperty(default=False, update=f_update_烟雾修改器_set高精度)
	m_精度 = bpy.props.IntProperty(default=64, update=f_update_烟雾修改器_设置精度)

	
	def init(self, context):
		super(C_Node_烟雾修改器, self).f_init(context)
		self.bl_icon = 'MOD_SMOKE'
		self.inputs.new('C_Socket_物体_Array1D', name='修改对象集')
		self.m_修改器名称 = 'Smoke'

		self.f_toCPP(self.id_data);

	def draw_buttons(self, context, layout):
		显示选项布局 = layout.row(align=True)
		显示选项布局.prop(self, 'm_修改器名称', icon='MOD_SMOKE')
		显示选项布局.prop(self, 'm_是否渲染', icon='RESTRICT_RENDER_OFF', icon_only=True)
		显示选项布局.prop(self, 'm_是否显示', icon='RESTRICT_VIEW_OFF', icon_only=True)

		layout.prop(self, 'm_烟雾类型')
		if self.m_烟雾类型 == 'DOMAIN':
			layout.prop(self, 'm_精度')

			layout.prop(self, 'm_外部路径')
			layout.prop(self, 'm_缓存名称')
			layout.prop(self, 'm_根路径')
			layout.prop(self, 'm_高精度')
		

	def f_toCPP(self, tree):
		是否更新 = engineLib.flexCAPI.f_创建烟雾修改器节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 是否更新 :
			self.use_custom_color = True
			self.color = bl_UI配色.g_Bl修改器节点颜色

	def f_update(self, 是否向下传递=False, input插座=None):
		
		修改对象 = self.inputs['修改对象集'].f_getData()
		#print('修改对象 = ', 修改对象)
		对象数量 = len(修改对象)
		if 对象数量 <= 0 : return False
		
		for obj in 修改对象:
			修改器ID = obj.modifiers.find(self.m_修改器名称)
			if 修改器ID >= 0 :
				修改器 = obj.modifiers[修改器ID]
			else:
				修改器 = obj.modifiers.new(self.m_修改器名称, 'SMOKE')
				self.m_修改器名称 = 修改器.name
			
			bl_修改器公共选项.f_set修改器可视(修改器, self.m_是否显示, self.m_是否渲染)

			修改器.smoke_type = self.m_烟雾类型
			#print('修改器.smoke_type = ', 修改器.smoke_type, self.m_烟雾类型)
			if self.m_烟雾类型 == 'DOMAIN':
				修改器.domain_settings.point_cache.name = self.m_缓存名称
				修改器.domain_settings.point_cache.use_external = self.m_外部路径
				if self.m_外部路径 :
					修改器.domain_settings.point_cache.filepath = self.m_根路径







class C_NODE_MENU_烟雾修改器(bpy.types.Operator):
	bl_idname = 'node.global_node_obj_modifiers_smoke'
	bl_label = '烟雾修改器'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_烟雾修改器', use_transform=True)
		return {'FINISHED'}





classes = (
	C_Node_烟雾修改器,
	C_NODE_MENU_烟雾修改器,
	
)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		
def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)


